package com.xxxtea.controller;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.Result;
import com.xxxtea.common.UserContext;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.Review;
import com.xxxtea.entity.SecondhandGoods;
import com.xxxtea.service.ReviewService;
import com.xxxtea.service.SecondhandGoodsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 旧物商品控制器
 *
 * 提供旧物商品的完整CRUD操作，包括：
 * - 商品的增删改查
 * - 分页查询和条件筛选
 * - 商品评价关联查询
 * - 用户权限控制
 *
 * 使用Swagger注解进行API文档生成
 * 使用Lombok注解简化代码
 *
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Api("旧物商品接口")
@RestController
@RequestMapping("/secondhandGoods")
public class SecondhandGoodsController {
	/**
	 * 评价服务
	 */
	@Resource
	private ReviewService reviewService;
	
	/**
	 * 旧物商品服务
	 */
	@Resource
	private SecondhandGoodsService secondhandGoodsService;

	/**
	 * 新增旧物商品
	 *
	 * @param request 旧物商品信息
	 * @return 操作结果
	 */
	@PostMapping
	@ApiOperation("新增旧物商品")
	public Result<String> save(@RequestBody SecondhandGoods request) {
		if (!secondhandGoodsService.save(request)) {
			return Result.error("添加失败!");
		}
		return Result.success();
	}

	/**
	 * 删除旧物商品
	 *
	 * @param id 商品ID
	 * @return 操作结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除旧物商品")
	public Result<String> removeById(@PathVariable String id) {
		if (!secondhandGoodsService.removeById(id)) {
			return Result.error("删除失败!");
		}
		return Result.success();
	}

	/**
	 * 更新旧物商品
	 *
	 * @param request 旧物商品信息
	 * @return 操作结果
	 */
	@PutMapping
	@ApiOperation("更新旧物商品")
	public Result<String> updateById(@RequestBody SecondhandGoods request) {
		if (!secondhandGoodsService.updateById(request)) {
			return Result.error("更新失败!");
		}
		return Result.success();
	}

	/**
	 * 查询旧物商品详情
	 * 包含商品的评价信息
	 *
	 * @param id 商品ID
	 * @return 商品详情信息
	 */
	@GetMapping("/{id}")
	@ApiOperation("查询旧物商品详情")
	public Result<SecondhandGoods> getById(@PathVariable String id) {
		SecondhandGoods secondhandGoods = secondhandGoodsService.getById(id);
		// 查询商品的评价列表
		List<Review> reviewList = reviewService.lambdaQuery().eq(Review::getBusinessType, Review.BusinessType.PRODUCT)
				.eq(Review::getBusinessId, id).list();
		secondhandGoods.setReviewList(reviewList);
		return Result.success(secondhandGoods);
	}

	/**
	 * 查询旧物商品列表
	 *
	 * @param request 查询条件
	 * @return 商品列表
	 */
	@GetMapping("/list")
	@ApiOperation("查询旧物商品列表")
	public Result<List<SecondhandGoods>> list(SecondhandGoods request) {
		LambdaQueryWrapper<SecondhandGoods> wrapper = new LambdaQueryWrapper<>(request);
		return Result.success(secondhandGoodsService.list(wrapper));
	}

	/**
	 * 分页查询旧物商品
	 * 支持价格范围、状态、发布者等条件筛选
	 *
	 * @param request 分页查询条件
	 * @return 分页商品列表
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询旧物商品")
	public Result<Page<SecondhandGoods>> page(@RequestBody PageQuery<SecondhandGoods> request) {
		SecondhandGoods param = request.getParam();
		LambdaQueryWrapper<SecondhandGoods> wrapper = new LambdaQueryWrapper<>(param);
		// 按ID倒序排列
		wrapper.orderByDesc(SecondhandGoods::getId);
		// 价格范围筛选
		wrapper.ge(param.getMinPrice() != null, SecondhandGoods::getPrice, param.getMinPrice());
		wrapper.le(param.getMaxPrice() != null, SecondhandGoods::getPrice, param.getMaxPrice());
		// 状态列表筛选
		wrapper.in(CollUtil.isNotEmpty(param.getStatusList()), SecondhandGoods::getStatus, param.getStatusList());

		// 发布者筛选（我发布的/非我发布的）
		Boolean publishedByMe = param.getPublishedByMe();
		if (publishedByMe != null) {
			wrapper.eq(publishedByMe, SecondhandGoods::getSellerId, UserContext.getId());
			wrapper.ne(!publishedByMe, SecondhandGoods::getSellerId, UserContext.getId());
		}

		Page<SecondhandGoods> pageResult = secondhandGoodsService.page(request.toPage(), wrapper);
		// 设置额外的数据（如距离、收藏状态等）
		secondhandGoodsService.setExtraData(pageResult.getRecords());
		return Result.success(pageResult);
	}
}